package com.rd.student.ruanjian.class4.zhangrui.day8_2.review;

public class ReviewSynchronized implements Runnable {
    int ticketsNum = 100;
    Object obj = new Object();

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }

            synchronized (obj) {//保证同一时刻只有一个线程执行该代码块或者方法
                if (ticketsNum <= 0) {
                    System.out.println("票买光了");
                    return;
                }

                System.out.println(Thread.currentThread().getName() +
                        " 出票：" + ticketsNum);
                ticketsNum--;
            }
            /*private synchronized void info(){
                if (ticketsNum <= 0) {
                    System.out.println("票买光了");
                    throw new RuntimeException();
                }

                System.out.println(Thread.currentThread().getName() +
                        " 出票：" + ticketsNum);
                ticketsNum--;
            }*/
            //synchronized可以修饰方法，被修饰的方法叫做同步方法。
        }
    }

    public static void main(String[] args) {
        ReviewSynchronized ticket = new ReviewSynchronized();
        Thread t1 = new Thread(ticket);
        Thread t2 = new Thread(ticket);
        Thread t3 = new Thread(ticket);
        Thread t4 = new Thread(ticket);
        Thread t5 = new Thread(ticket);

        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }//加锁时使用同一个对象是需要保证锁时唯一的，也就是说锁住的对象时同一个。
}
//synchronized(同步监视器) {
//      需要被同步的代码
//}  是为了避免多个线程同时对其进行读写操作后而银达数据的不一致性或者并发访问的问题。
